package com.chenfan.mcn.dao;

import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chenfan.common.extension.mybatisplus.enhanced.EnhancedBaseMapper;
import com.chenfan.mcn.model.ContractExcutionOrder;
import com.chenfan.mcn.model.McnPage;
import com.chenfan.mcn.model.dto.AeQueryExcutionOrderDTO;
import com.chenfan.mcn.model.dto.ChooseExecutionDTO;
import com.chenfan.mcn.model.dto.DevidedAmountDTO;
import com.chenfan.mcn.model.dto.ExcutionOrderSearchDTO;
import com.chenfan.mcn.model.rpc.FinanceExcutionOrderVO;
import com.chenfan.mcn.model.vo.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * @author tangwei
 * Date:     2021/1/20 11:04
 * Description: 合同执行单
 */
@Mapper
public interface ContractExcutionOrderMapper extends EnhancedBaseMapper<ContractExcutionOrder> {
    /**
     * 搜索执行单列表
     *
     * @param mcnPage
     * @param dto
     * @return IPage<ExcutionOrderVO>
     */
    Page<ExcutionOrderVO> getPage(McnPage<ExcutionOrderVO> mcnPage, @Param("dto") ExcutionOrderSearchDTO dto);

    /**
     * 查询执行单导出列表
     *
     * @param dto {@link ExcutionOrderSearchDTO}
     * @return List<ExcutionExportVO>
     */
    List<ExcutionExportVO> exportList(@Param("dto") ExcutionOrderSearchDTO dto);

    /**
     * 财务红人分成结算单的执行单信息
     *
     * @param excuteCode
     * @return ExcutionSettleInfoVO
     */
    ExcutionSettleInfoVO getStarSettle(@Param("excuteCode") String excuteCode);


    /**
     * 批量查询财务红人分成账户信息
     *
     * @param excuteCodes
     * @return InvoiceAccountInfoVO
     */
    List<InvoiceAccountInfoVO> getBatchStarSettle(@Param("excuteCodes") List<String> excuteCodes);

    /**
     * 财务红人采购费结算单的执行单信息
     *
     * @param excuteCode
     * @return ExcutionSettleInfoVO
     */
    ExcutionSettleInfoVO getPurchaseSettle(@Param("excuteCode") String excuteCode);

    /**
     * 批量查询财务红人采购费账户信息
     *
     * @param excuteCodes
     * @return InvoiceAccountInfoVO
     */
    List<InvoiceAccountInfoVO> getBatchPurchaseSettle(@Param("excuteCodes") List<String> excuteCodes);

    /**
     * 财务客户返点费结算单的执行单信息
     *
     * @param excuteCode
     * @return ExcutionSettleInfoVO
     */
    ExcutionSettleInfoVO getCustomerSettle(@Param("excuteCode") String excuteCode);

    /**
     * 财务客户返点费结算单的执行单信息
     *
     * @param excuteCodes
     * @return ExcutionSettleInfoVO
     */
    List<InvoiceAccountInfoVO> getBatchCustomerSettle(@Param("rebateContractCodes") List<String> excuteCodes);

    /**
     * 红人月度执行单数量&金额（本月）
     *
     * @param type {@link Integer}
     * @param page {@link McnPage}
     * @return
     */
    Page<RedManMonthlyExecution> redManMonthlyExecution(Integer type, McnPage<RedManMonthlyExecution> page);

    /**
     * 执行单执行数量
     * @param type
     * @param beginOfMonth
     * @param endOfMonth
     * @return
     */
    List<ExcutionOrderCountVO> totalCount(@Param("type") Integer type, @Param("beginOfMonth") Date beginOfMonth, @Param("endOfMonth") Date endOfMonth);

    /**
     * 红人执行单列表
     *
     * @param page       {@link McnPage}
     * @param starId     {@link Long}
     * @param processIds {@link List<Long>}
     * @return {@link Page}
     */
    Page<StarExecutionVO> executionList(McnPage<StarExecutionVO> page, @Param("starId") Long starId, List<Long> processIds);

    /**
     * 客户关联的执行单
     *
     * @param mcnPage    McnPage<CusExcutionOrderVO>
     * @param customerId Long
     * @param processIds List
     * @return CusExcutionOrderVO
     */
    Page<CusExcutionOrderVO> getCusExcutionOrder(McnPage<CusExcutionOrderVO> mcnPage, @Param("customerId") Long customerId, List<Long> processIds);

    /**
     * 修改详情
     *
     * @param dto ContractExcutionOrder
     * @return Integer
     */
    Integer updateDetail(@Param(Constants.ENTITY) ContractExcutionOrder dto);

    /**
     * 获取收入合同下所有非作废状态下的【执行单总金额】之和
     *
     * @param incomeContractId {@link Long}
     * @return {@link BigDecimal}
     */
    BigDecimal totalAmountOfExecutionOrder(Long incomeContractId);

    /**
     * 搜索AE执行单列表
     *
     * @param mcnPage
     * @param dto
     * @return Page<ExcutionOrderVO>
     */
    Page<ExcutionOrderVO> getAePage(Page<ExcutionOrderVO> mcnPage, @Param("dto") ExcutionOrderSearchDTO dto);

    /**
     * 搜索红人返点合同-执行单执行单列表
     *
     * @param mcnPage
     * @param dto
     * @return Page<StarRebateExcutionOrderVO>
     */
    Page<StarRebateExcutionOrderVO> getStarRebatePage(McnPage<ExcutionOrderVO> mcnPage, @Param("dto") ExcutionOrderSearchDTO dto);

    /**
     * 客户返点合同-弹框分页查询执行单
     * @param mcnPage
     * @param excutionOrderSearchDTO
     * @return
     */
    Page<AnnualRebateExcutionOrderVO> getAnnualRebatePage(McnPage<ExcutionOrderVO> mcnPage, @Param("dto") ExcutionOrderSearchDTO excutionOrderSearchDTO);

    /**
     * 客户返点合同-获取所有关联的执行单
     * @param ids 执行单ID集合
     * @return
     */
    List<AnnualRebateExcutionOrderVO> getAnnualRebateList(@Param("ids") List<Long> ids);

    /**
     * 根据条件获取执行单
     *
     * @param dto
     * @return
     */
    List<Long> getContractExcutionOrderByCondition(@Param("dto") AeQueryExcutionOrderDTO dto);

    /**
     * 批量更新执行单AE提成结算状态
     *
     * @param excutionOrderIds       执行单id集合
     * @param commissionSettleStatus AE提成结算状态：0:未结算；1:结算中；2:已结算
     * @return Integer
     */
    Integer batchUpdateSettleStatus(@Param("excutionOrderIds") List<Long> excutionOrderIds, @Param("commissionSettleStatus") Integer commissionSettleStatus);

    /**
     * 查询收入合同下的执行单信息，用于计算预估成本
     *
     * @param incomeContractId
     * @return List<DevidedAmountDTO> {@link DevidedAmountDTO}
     */
    @Deprecated
    List<DevidedAmountDTO> getExcutionList(@Param("incomeContractId") Long incomeContractId);

    /**
     * 查询收入合同补充协议下的执行单信息，用于计算预估成本
     *
     * @param agreementId
     * @return List<DevidedAmountDTO> {@link DevidedAmountDTO}
     */
    List<DevidedAmountDTO> getAgreementExcutionList(@Param("agreementId") Long agreementId);

    /**
     * 采购合同关联执行单弹窗
     *
     * @param page         分页
     * @param executionDTO 入参
     * @return
     */
    Page<ChooseExecution> getExecutionOrders(McnPage<ChooseExecution> page, @Param("dto") ChooseExecutionDTO executionDTO);

    /**
     * 获取采购合同详情中执行单列表数据
     *
     * @param page 分页
     * @param list 执行单编号
     * @return
     */
    Page<ChooseExecution> getPurchaseInfo(McnPage<PurchaseContractVO> page, @Param("list") List<String> list);

    /**
     * 执行单批量修改采购单号（采购单新增）
     *
     * @param list         执行单号
     * @param contractCode 采购单号
     */
    void batchUpdatePurchaseCode(@Param("list") List<String> list, @Param("contractCode") String contractCode);

    /**
     * 根据star_rebate_id获取contract_excution_order数据
     *
     * @param starRebateId
     * @return
     */
    List<ContractExcutionOrder> selectByStarRebateId(@Param("starRebateId") Long starRebateId);

    /**
     * 根据执行单编号获取执行单
     * @param excuteCode
     * @param tenantId
     * @return
     */
    ContractExcutionOrder getByCode(String excuteCode, Long tenantId);

    /**
     * 通过执行单编号获取财务执行单信息
     * @param excuteCodes
     * @return
     */
    List<FinanceExcutionOrderVO> getFinanceExcutionOrderByCodes(List<String> excuteCodes);

    /**
     *
     * @param ids
     * @return
     */
    List<String> selectIncomeContractCodesById(@Param("ids") List<Long> ids);

    /**
     * 通过执行单ID集合获取提成执行单信息
     */
    List<CommissionContractExcutionOrderVO> selectCommissionContractExcutionOrderByIds(@Param("ids") List<Long> ids);

    /**
     * 同步执行单回款状态
     * @param zxdPaybackEffectiveTime
     * @return
     */
    int syncExcutionOrderPayback(@Param("zxdPaybackEffectiveTime") Date zxdPaybackEffectiveTime);

    /**
     * 同步执行单打款状态
     * @param settlementMethodList
     * @param zxdPaybackEffectiveTime
     * @return
     */
    int syncExcutionOrderPaid(@Param("settlementMethodList") List<String> settlementMethodList, @Param("zxdPaybackEffectiveTime") Date zxdPaybackEffectiveTime);

    /**
     * 获取重复的执行单信息
     * @param starPlatformInfoId
     * @param brandName
     * @param realAmount
     * @param publishStartDate
     * @param publishEndDate
     * @return
     */
    List<ContractExcutionOrder> getRepeatedContractExcutionOrders(@Param("excludeIds") List<Long> excludeIds,
                                                                  @Param("starPlatformInfoId") Long starPlatformInfoId,
                                                                  @Param("brandName") String brandName,
                                                                  @Param("realAmount") BigDecimal realAmount,
                                                                  @Param("publishStartDate") Date publishStartDate,
                                                                  @Param("publishEndDate") Date publishEndDate);

    /**
     * 根据执行单ID获取我司合同主体ID集合
     * @param ids
     * @return
     */
    List<Long> getContractingIds(@Param("ids") List<Long> ids);
}